#ifndef HP4067MUX_H
#define HP4067MUX_H

#include <Arduino.h>

// HP4067 引脚定义
#define MUX1_S0   16
#define MUX1_S1   17
#define MUX1_S2   18
#define MUX1_S3   19
#define MUX1_EN   21  // 低电平有效
#define MUX1_SIG  33  // ADC引脚

class Hp4067Mux {
  public:
    // 初始化多路复用器
    void begin() {
      // 设置控制引脚为输出模式
      pinMode(MUX1_S0, OUTPUT);
      pinMode(MUX1_S1, OUTPUT);
      pinMode(MUX1_S2, OUTPUT);
      pinMode(MUX1_S3, OUTPUT);
      pinMode(MUX1_EN, OUTPUT);
      
      // 初始禁用多路器
      digitalWrite(MUX1_EN, HIGH);
      
      // 配置ADC精度
      analogSetWidth(12);  // 12位ADC，范围0-4095
      analogSetPinAttenuation(MUX1_SIG, ADC_11db);  // 增加测量范围
    }

    // 选择指定通道(0-15)
    void selectChannel(uint8_t channel) {
      if (channel > 15) return;  // 确保通道在有效范围内
      
      // 设置通道选择引脚
      digitalWrite(MUX1_S0, (channel & 0x01) != 0);
      digitalWrite(MUX1_S1, (channel & 0x02) != 0);
      digitalWrite(MUX1_S2, (channel & 0x04) != 0);
      digitalWrite(MUX1_S3, (channel & 0x08) != 0);
      
      // 启用多路器
      digitalWrite(MUX1_EN, LOW);
      delayMicroseconds(20);  // 等待通道稳定
    }

    // 读取当前选中通道的电位器值
    uint16_t readPotentiometer() {
      if (digitalRead(MUX1_EN) == HIGH) {
        return 0;  // 多路器未启用时返回0
      }
      
      // 多次采样取平均值，减少噪声
      uint32_t sum = 0;
      for (uint8_t i = 0; i < 8; i++) {
        sum += analogRead(MUX1_SIG);
        delayMicroseconds(50);
      }
      return sum / 8;
    }

    // 禁用多路器
    void disable() {
      digitalWrite(MUX1_EN, HIGH);
    }

    // 读取指定通道的电位器值(一站式操作)
    uint16_t readChannel(uint8_t channel) {
      selectChannel(channel);
      uint16_t value = readPotentiometer();
      disable();
      return value;
    }
};

#endif
